//package com.fr.football;
//
//import org.apache.spark.SparkConf;
//import org.apache.spark.api.java.JavaRDD;
//import org.apache.spark.api.java.JavaSparkContext;
//import org.apache.spark.ml.Pipeline;
//import org.apache.spark.ml.PipelineStage;
//import org.apache.spark.ml.classification.RandomForestClassifier;
//import org.apache.spark.ml.evaluation.BinaryClassificationEvaluator;
//import org.apache.spark.ml.feature.StringIndexer;
//import org.apache.spark.ml.param.ParamMap;
//import org.apache.spark.ml.tuning.CrossValidator;
//import org.apache.spark.ml.tuning.ParamGridBuilder;
//import org.apache.spark.mllib.linalg.Vector;
//import org.apache.spark.mllib.linalg.Vectors;
//import org.apache.spark.mllib.regression.LabeledPoint;
//
//public class RandonForestTest {
//	public static void main(String[] args) {
//		SparkConf conf = new SparkConf().setMaster("local").setAppName("fr");
//		JavaSparkContext jsc = new JavaSparkContext(conf);
//		// 将数据分割为训练集、交叉检验集(CV)和测试集
//
//		// 第一步，预处理数据，构建为DataFrame格式
//		JavaRDD<LabeledPoint> data = readData(jsc);
//
//		// 第二步，将数据随机分为训练集和测试集
//		JavaRDD<LabeledPoint>[] splitArray = data.randomSplit(new double[] { 0.8, 0.2});
//		JavaRDD<LabeledPoint> trainData = splitArray[0];
//		trainData.cache();
//		JavaRDD<LabeledPoint> testData = splitArray[2];
//		testData.cache();
//
//		// 第三步，准备一些基本参数和标签列indexer
//		// 设置K折交叉验证的K的数量，以及随机森林树的数量，树的数量增加会大幅度增加训练时间
//		int nFolds = 10;
//		int NumTrees = 500; // 800,2000
//
//		StringIndexer indexer = new StringIndexer().setInputCol("label").setOutputCol("label_idx");
//
//		// 第四步，创建随机森林分类器
//		RandomForestClassifier rf = new RandomForestClassifier().setNumTrees(NumTrees).setFeaturesCol("features")
//				.setLabelCol("label_idx").setFeatureSubsetStrategy("auto").setImpurity("gini").setMaxDepth(10) // 2,5,7
//				.setMaxBins(100);
//
//		// 第五步，创建pipeline
//		PipelineStage[] ps = new PipelineStage[1];
//		
//		Pipeline pipeline = new Pipeline().setStages(ps);
//
//		// 第六步，创建参数
//		ParamMap[] paramGrid = new ParamGridBuilder().build();
//
//		// 第七步，设置预测效果测量器
//		BinaryClassificationEvaluator evaluator = new BinaryClassificationEvaluator().setLabelCol("label")
//				.setRawPredictionCol("rawPrediction").setMetricName("areaUnderROC");
//
//		// 第八步，创建交叉验证对象，设置好pipeline、测量器、参数、K的数量
//		CrossValidator cv = new CrossValidator().setEstimator(pipeline).setEvaluator(evaluator)
//				.setEstimatorParamMaps(paramGrid).setNumFolds(nFolds);
//
//		// 第九步，使用训练集训练模型
//		val model = cv.fit(trainData);
//
//		// 第十步，拿训练好的模型预测测试集
//		val predictions = model.transform(testData);
//
//		predictions.show();
//
//		// 第十一步，测量预测效果
//		double metrics = evaluator.evaluate(predictions);
//		System.out.println(metrics);
//	}
//
//	// 将标签转换为0和1
//
//	public static JavaRDD<LabeledPoint> readData(JavaSparkContext jsc) {
//
//		JavaRDD<String> rawData = jsc.textFile("F:\\data\\1.txt");
//
//		JavaRDD<LabeledPoint> data = rawData.map(line -> {
//
//			String[] values = line.split("\t");
//
//			double[] features = new double[values.length - 1];
//
//			for (int i = 0; i < values.length - 1; i++) {
//				double value = Double.parseDouble(values[i]);
//				if (value == 0.00d) {
//					continue;
//				}
//				features[i] = value;
//			}
//			Vector featureVector = Vectors.dense(features);
//			Double label = (double) (Double.parseDouble(values[values.length - 1]) - 1);
//			return new LabeledPoint(label, featureVector);
//		});
//		return data;
//	}
//}
